1 module hip.api.renderer.shader; 2 public import hip.api.renderer.operations; 3 public import hip.api.renderer.texture; 4 public import hip.api.renderer.shadervar; 5 6 enum ShaderStatus : ubyte 7 { 8 SUCCESS, 9 VERTEX_COMPILATION_ERROR, 10 FRAGMENT_COMPILATION_ERROR, 11 LINK_ERROR, 12 UNKNOWN_ERROR 13 } 14 15 enum ShaderTypes : ubyte 16 { 17 vertex, 18 fragment, 19 geometry, //Unsupported yet 20 none 21 } 22 23 enum HipShaderPresets : ubyte 24 { 25 DEFAULT, 26 FRAME_BUFFER, 27 GEOMETRY_BATCH, 28 SPRITE_BATCH, 29 BITMAP_TEXT, 30 NONE 31 } 32 33 /** 34 * This interface is currrently a Shader factory. 35 */ 36 interface IShader 37 { 38 VertexShader createVertexShader(); 39 FragmentShader createFragmentShader(); 40 ShaderProgram createShaderProgram(); 41 42 bool compileShader(FragmentShader fs, string shaderSource); 43 bool compileShader(VertexShader vs, string shaderSource); 44 bool linkProgram(ref ShaderProgram program, VertexShader vs, FragmentShader fs); 45 46 void setBlending(ShaderProgram prog, HipBlendFunction src, HipBlendFunction dst, HipBlendEquation eq); 47 void bind(ShaderProgram program); 48 void unbind(ShaderProgram program); 49 void sendVertexAttribute(uint layoutIndex, int valueAmount, uint dataType, bool normalize, uint stride, int offset); 50 int getId(ref ShaderProgram prog, string name); 51 52 53 ///Used as intermediary for deleting non program intermediary in opengl 54 void deleteShader(FragmentShader* fs); 55 ///Used as intermediary for deleting non program intermediary in opengl 56 void deleteShader(VertexShader* vs); 57 58 void createVariablesBlock(ref ShaderVariablesLayout layout, ShaderProgram shaderProgram); 59 bool setShaderVar(ShaderVar* sv, ShaderProgram prog, void* value); 60 void sendVars(ref ShaderProgram prog, ShaderVariablesLayout[string] layouts); 61 62 /** 63 * Each graphics API has its own way to bind array of textures, thus, this version was required. 64 */ 65 void bindArrayOfTextures(ref ShaderProgram prog, IHipTexture[] textures, string varName); 66 void dispose(ref ShaderProgram); 67 68 void onRenderFrameEnd(ShaderProgram program); 69 } 70 71 abstract class VertexShader 72 { 73 } 74 abstract class FragmentShader 75 { 76 } 77 78 abstract class ShaderProgram 79 { 80 string name; 81 }